from __future__ import print_function  # python2 import这一行就可以使用print()

'''
如果想要完全等价实现数学(高等数学等高级姿势)
numpy SciPy
'''

# 算术运算符
'''
运算符	描述	实例
+	加 - 两个对象相加	a + b 输出结果 30
-	减 - 得到负数或是一个数减去另一个数	a - b 输出结果 -10
*	乘 - 两个数相乘或是返回一个被重复若干次的字符串	a * b 输出结果 200
/	除 - x除以y	b / a 输出结果 2
%	取模 - 返回除法的余数	b % a 输出结果 0
**	幂 - 返回x的y次幂	a**b 为10的20次方， 输出结果 100000000000000000000
//	取整除 - 返回商的整数部分	9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
'''

a = 21
b = 10
c = 0

c = a + b
print("a + b 的值为：", c)

c = a - b
print("a - b 的值为：", c)

c = a * b
print("a * b 的值为：", c)

c = a / b
print("a 除以 b 的值为：", c)

c = a % b
print("a/b 取余数(模)  的值为：", c)

# 修改变量 a 、b 、c
a = 2
b = 3
c = a ** b
print("a b次方 的值为：", c)

a = 10
b = 5
c = a // b
print("a除以b 取整数部分 的值为：", c)
print("9//2 的值为：%s" % (9 // 2))

# 比较运算符

'''
运算符	描述	                          实例
==	等于 - 比较对象是否相等	(a == b) 返回 False。
!=	不等于 - 比较两个对象是否不相等	(a != b) 返回 true.
<>	不等于 - 比较两个对象是否不相等	(a <> b) 返回 true。这个运算符类似 != 。
>	大于 - 返回x是否大于y	(a > b) 返回 False。
<	小于 - 返回x是否小于y。所有比较运算符返回1表示真，返回0表示假。这分别与特殊的变量True和False等价。注意，这些变量名的大写。	(a < b) 返回 true。
>=	大于等于 - 返回x是否大于等于y。	(a >= b) 返回 False。
<=	小于等于 - 返回x是否小于等于y。	(a <= b) 返回 true。
'''

# 赋值运算符
'''
运算符	描述	                  实例
=	简单的赋值运算符	c = a + b 将 a + b 的运算结果赋值为 c
+=	加法赋值运算符	c += a 等效于 c = c + a
-=	减法赋值运算符	c -= a 等效于 c = c - a
*=	乘法赋值运算符	c *= a 等效于 c = c * a
/=	除法赋值运算符	c /= a 等效于 c = c / a
%=	取模赋值运算符	c %= a 等效于 c = c % a
**=	幂赋值运算符	c **= a 等效于 c = c ** a
//=	取整除赋值运算符	c //= a 等效于 c = c // a
'''
a = 1
b = 2
a += b  # a=a+b
print(a)

# 位运算符
# 位运算符是非常快的，机器硬件层面支持

'''
运算符	描述	实例
&	按位与运算符	(a & b) 输出结果 12 ，二进制解释： 0000 1100
|	按位或运算符	(a | b) 输出结果 61 ，二进制解释： 0011 1101
^	按位异或运算符	(a ^ b) 输出结果 49 ，二进制解释： 0011 0001
~	按位取反运算符	(~a ) 输出结果 -61 ，二进制解释： 1100 0011， 在一个有符号二进制数的补码形式。
<<	左移动运算符	a << 2 输出结果 240 ，二进制解释： 1111 0000
>>	右移动运算符	a >> 2 输出结果 15 ，二进制解释： 0000 1111
'''

a = 3 << 3  # 3* (右边值的2的几次方:3*(2**3))
b = 3 * (2 ** 3)
print(b, a, a == b)
print('3 << 3表示 3*(2**3) %s' % a)

a = 12 >> 3  # 12/ (右边值的2的几次方:12/(2**3)) 只会取整
b = 12 / (2 ** 3)  # 2.0会带小数点
c = 12 // (2 ** 3)  # 2.0会带小数点
print(a, b, c, a == b, a == c)  # 1 1.5 1 False True
print(a)

# 位运算符
a = 60  # 60 = 0011 1100
b = 13  # 13 = 0000 1101
c = 0

c = a & b  # 12 = 0000 1100 一句话概括：都是1为1，否则为0
print("a & b 的值为：", c)

c = a | b  # 61 = 0011 1101 一句话概括：只要有1为1，否则(都是0)为0
print("a | b的值为：", c)

c = a ^ b  # 49 = 0011 0001 一句话概括：同0，异1
print("a ^ b 的值为：", c)

c = ~a  # -67 = 1100 0011  一句话概括：每位取反
print("~a的值为：", c)

# 逻辑运算符

'''
运算符	逻辑表达式	描述	实例
and	x and y	布尔"与" - 如果 x 为 False，x and y 返回 False，否则它返回 y 的计算值。	(a and b) 返回 20。
or	x or y	布尔"或" - 如果 x 是非 0，它返回 x 的值，否则它返回 y 的计算值。	(a or b) 返回 10。
not	not x	布尔"非" - 如果 x 为 True，返回 False 。如果 x 为 False，它返回 True。	not(a and b) 返回 False
'''
if 1 and 2:  # if条件判断满足True则走该分支
    print(True)
else:
    print(False)
if 1 and 0:
    print(True)
else:
    print(False)
if 1 or 2:
    print(True)
else:
    print(False)
if 1 or 0:
    print(True)
else:
    print(False)
if not 1:
    print(True)
else:
    print(False)
if not 0:
    print(True)
else:
    print(False)

# 运算符优先级
'''
运算符	描述
**	指数 (最高优先级)
~ + -	按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //	乘，除，取模和取整除
+ -	加法减法
>> <<	右移，左移运算符
&	位 'AND'
^ |	位运算符
<= < > >=	比较运算符
<> == !=	等于运算符
= %= /= //= -= += *= **=	赋值运算符
is is not	身份运算符
in not in	成员运算符
not or and	逻辑运算符
'''

a = 20
b = 10
c = 15
d = 5
e = 0

e = (a + b) * c / d  # ( 30 * 15 ) / 5
print("(a + b) * c / d 运算结果为：", e)

e = ((a + b) * c) / d  # (30 * 15 ) / 5
print("((a + b) * c) / d 运算结果为：", e)

e = (a + b) * (c / d)  # (30) * (15/5)
print("(a + b) * (c / d) 运算结果为：", e)

e = a + (b * c) / d  # 20 + (150/5)
print("a + (b * c) / d 运算结果为：", e)

# 成员运算符 (字符串，列表或元组)
'''
运算符	描述	实例
in	如果在指定的序列中找到值返回True，否则返回False。	x 在 y序列中 , 如果x在y序列中返回True。
not in	如果在指定的序列中没有找到值返回True，否则返回False。	x 不在 y序列中 , 如果x不在y序列中返回True。
'''

a = 10
b = 20
ls = [1, 2, 3, 4, 5]  # 可以是元组

if a in ls:
    print("1 - 变量 a 在给定的列表中 list 中")
else:
    print("1 - 变量 a 不在给定的列表中 list 中")
if b not in ls:
    print("2 - 变量 b 不在给定的列表中 list 中")
else:
    print("2 - 变量 b 在给定的列表中 list 中")
# 修改变量 a 的值)
a = 2
if a in ls:
    print("3 - 变量 a 在给定的列表中 list 中")
else:
    print("3 - 变量 a 不在给定的列表中 list 中")

# 身份运算符
'''
运算符	描述	实例
is	is是判断两个标识符是不是引用自一个对象	x is y, 如果 id(x) 等于 id(y) , is 返回结果 1
is not	is not是判断两个标识符是不是引用自不同对象	x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1
==  判断值是否相等 值相等就是True
'''
a = 20
b = 20

if (a is b):
    print("1 - a 和 b 有相同的标识")
else:
    print("1 - a 和 b 没有相同的标识")

if (id(a) == id(b)):
    print("2 - a 和 b 有相同的标识")
else:
    print("2 - a 和 b 没有相同的标识")

# 修改变量 b 的值
b = 30
if (a is b):
    print("3 - a 和 b 有相同的标识")
else:
    print("3 - a 和 b 没有相同的标识")

if (a is not b):
    print("4 - a 和 b 没有相同的标识")
else:
    print("4 - a 和 b 有相同的标识")

a = [1, 2]
b = a[:]

print(a is b, a == b)
